package com.seafood.service;

import com.seafood.dto.ColdChainAlertDTO;
import com.seafood.entity.ColdChainAlert;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 冷链报警服务接口
 */
public interface ColdChainAlertService {
    
    /**
     * 创建冷链报警
     */
    ColdChainAlertDTO createColdChainAlert(ColdChainAlertDTO alertDTO);
    
    /**
     * 批量创建报警
     */
    List<ColdChainAlertDTO> createColdChainAlerts(List<ColdChainAlertDTO> alertDTOs);
    
    /**
     * 根据ID获取报警
     */
    ColdChainAlertDTO getColdChainAlertById(Long id);
    
    /**
     * 根据冷链记录ID获取报警列表
     */
    List<ColdChainAlertDTO> getColdChainAlertsByColdChainRecordId(Long coldChainRecordId);
    
    /**
     * 获取未解决的报警
     */
    List<ColdChainAlertDTO> getUnresolvedAlerts(Long coldChainRecordId);
    
    /**
     * 获取所有未解决的报警（分页）
     */
    Page<ColdChainAlertDTO> getAllUnresolvedAlerts(Pageable pageable);
    
    /**
     * 根据报警类型获取报警
     */
    List<ColdChainAlertDTO> getAlertsByType(String alertType);
    
    /**
     * 根据严重程度获取报警
     */
    List<ColdChainAlertDTO> getAlertsBySeverity(String severity);
    
    /**
     * 获取高严重程度的未解决报警
     */
    List<ColdChainAlertDTO> getHighSeverityUnresolvedAlerts();
    
    /**
     * 根据时间范围查找报警
     */
    List<ColdChainAlertDTO> getAlertsByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取未发送通知的报警
     */
    List<ColdChainAlertDTO> getUnsentNotificationAlerts();
    
    /**
     * 解决报警
     */
    ColdChainAlertDTO resolveAlert(Long id, String resolvedBy, String resolutionNotes);
    
    /**
     * 批量解决报警
     */
    List<ColdChainAlertDTO> resolveAlerts(List<Long> alertIds, String resolvedBy, String resolutionNotes);
    
    /**
     * 标记通知已发送
     */
    ColdChainAlertDTO markNotificationSent(Long id);
    
    /**
     * 创建温度异常报警
     */
    ColdChainAlertDTO createTemperatureAlert(Long coldChainRecordId, String alertType, 
                                           String currentValue, String thresholdValue, 
                                           String location, String gpsCoordinates);
    
    /**
     * 创建湿度异常报警
     */
    ColdChainAlertDTO createHumidityAlert(Long coldChainRecordId, String alertType,
                                        String currentValue, String thresholdValue,
                                        String location, String gpsCoordinates);
    
    /**
     * 创建设备异常报警
     */
    ColdChainAlertDTO createDeviceAlert(Long coldChainRecordId, String alertType,
                                      String description, String location, String gpsCoordinates);
    
    /**
     * 获取报警统计信息
     */
    Map<String, Object> getAlertStatistics();
    
    /**
     * 获取各类型报警数量统计
     */
    Map<String, Long> getAlertCountByType();
    
    /**
     * 获取各严重程度报警数量统计
     */
    Map<String, Long> getAlertCountBySeverity();
    
    /**
     * 统计未解决报警数量
     */
    Long countUnresolvedAlerts(Long coldChainRecordId);
    
    /**
     * 发送报警通知
     */
    void sendAlertNotification(Long alertId);
    
    /**
     * 批量发送通知
     */
    void sendBatchNotifications(List<Long> alertIds);
    
    /**
     * 清理旧的已解决报警
     */
    void cleanupOldResolvedAlerts(LocalDateTime cutoffTime);
    
    /**
     * 删除报警
     */
    void deleteColdChainAlert(Long id);
}